home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Panorama / Panorama - Disk 19D (1987-07-22)(Pacific North-West Amigas Club)[WB].zip / Panorama - Disk 19D (1987-07-22)(Pacific North-West Amigas Club)[WB].adf / PipeHandler1.2 / loader.asm < prev    next >
Assembly Source File  |  1987-06-28  |  2KB  |  111 lines

  1. ; loader.asm
  2.  
  3.  
  4.         INCLUDE    "exec/types.i"
  5.         INCLUDE    "exec/exec.i"
  6.         INCLUDE    "libraries/dosextens.i"
  7.         INCLUDE    "libraries/amiga._LVO.i"
  8.  
  9.  
  10.         STRUCTURE    STACKDATA,0
  11.         APTR    Packet
  12.         LONG    ReturnVal
  13.         APTR    DOSBase
  14.         BPTR    Segment
  15.         BYTE    STACKDATA_SIZE
  16.  
  17.  
  18. LINKEXE:    MACRO
  19.         MOVEA.L    _AbsExecBase,A6
  20.         JSR    _LVO\1(A6)
  21.         ENDM
  22.  
  23. LINKDOS:    MACRO
  24.         MOVEA.L    DOSBase(SP),A6
  25.         JSR    _LVO\1(A6)
  26.         ENDM
  27.  
  28.  
  29. _AbsExecBase    EQU    4
  30.  
  31.  
  32. ;----------------------------------------------------------------------------
  33.  
  34. StartModule:    DC.L    (EndModule-StartModule)/4    ; for BCPL linking
  35.  
  36.  
  37. EntryPoint:    SUBA.L    #STACKDATA_SIZE,SP
  38.  
  39.         LSL.L    #2,D1            ; convert to byte pointer
  40.         MOVE.L    D1,Packet(SP)
  41.  
  42.         CLR.L    ReturnVal(SP)        ; no error - for now
  43.  
  44.  
  45. OpenDOS:    LEA    DOSName(PC),A1
  46.         CLR.L    D0
  47.         LINKEXE    OpenLibrary
  48.         MOVE.L    D0,DOSBase(SP)
  49.         BNE    LoadCode
  50.  
  51.         MOVE.L    #ERROR_INVALID_RESIDENT_LIBRARY,ReturnVal(SP)
  52.         BRA    Return
  53.         
  54.  
  55. LoadCode:    LEA    HandlerName(PC),A1
  56.         MOVE.L    A1,D1
  57.         LINKDOS    LoadSeg
  58.         MOVE.L    D0,Segment(SP)
  59.         BNE    CallHandler
  60.  
  61.         MOVE.L    #ERROR_OBJECT_NOT_FOUND,ReturnVal(SP)
  62.         BRA    CloseDOS
  63.  
  64.  
  65. CallHandler:    LEA    SPsave(PC),A1
  66.         MOVE.L    SP,(A1)            ; save current SP
  67.  
  68.         MOVE.L    Segment(SP),D0        ; BPTR to segment
  69.         LSL.L    #2,D0
  70.         MOVEA.L    D0,A0            ; byte pointer to segment
  71.         MOVE.L    Packet(SP),D0        ; packet address
  72.         MOVE.L     D0,-(SP)        ; push (not sure if safe above)
  73.  
  74. ; --- Now, call the loaded handler code.
  75. ; --- It is sent the byte address of the startup packet passed to this code.
  76.  
  77.         JSR    4(A0)            ; call first code in segment
  78.  
  79.         MOVEA.L    SPsave(PC),SP        ; restore SP
  80.  
  81.  
  82. UnloadCode:    MOVE.L    Segment(SP),D1
  83.         LINKDOS    UnLoadSeg
  84.  
  85. CloseDOS:    MOVE.L    DOSBase(SP),A1
  86.         LINKEXE    CloseLibrary
  87.  
  88. Return:        MOVE.L    ReturnVal(SP),D0    ; retrieve return value
  89.         ADDA.L    #STACKDATA_SIZE,SP
  90.         RTS
  91.  
  92.  
  93. SPsave:        DC.L    0
  94.  
  95. DOSName:    DOSNAME
  96.  
  97. HandlerName:    DC.B    'L:'
  98. ProcessName:    DC.B    'pipe-handler',0
  99.  
  100.  
  101. ;    trailing definitions for BCPL linking
  102.  
  103.         CNOP    0,4            ; align to lonword boundary
  104.  
  105.         DC.L    0            ; End Marker
  106.         DC.L    1            ; Global 1
  107.         DC.L    EntryPoint-StartModule    ; Offset
  108.         DC.L    1            ; Highest Global Used
  109.  
  110. EndModule:    END
  111.